﻿using Microsoft.Win32;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows;
using WpfApp1.Tools;
using CompareTools.Tools;
using System.Diagnostics;

namespace WpfApp1.ViewModel
{


    public class CompareDataViewModel : INotifyPropertyChanged
    {
        #region 分页相关属性
        /// <summary>
        /// 总数据量（私有字段）
        /// </summary>
        private int _totalCount;

        /// <summary>
        /// 总数据量（公开属性）
        /// 当值改变时触发PropertyChanged事件更新UI
        /// </summary>
        public int TotalCount
        {
            get => _totalCount;
            set
            {
                _totalCount = value;
                OnPropertyChanged(nameof(TotalCount)); // 通知UI更新
                OnPropertyChanged(nameof(TotalPages)); // 同时更新总页数显示
            }
        }

        /// <summary>
        /// 当前页码（私有字段）
        /// </summary>
        private int _currentPage = 1;

        /// <summary>
        /// 当前页码（公开属性）
        /// 设置时会自动更新当前页数据
        /// </summary>
        public int CurrentPage
        {
            get => _currentPage;
            set
            {
                _currentPage = value;
                OnPropertyChanged(nameof(CurrentPage)); // 通知UI更新
                UpdateCurrentPageData(); // 更新当前页显示的数据
            }
        }

        /// <summary>
        /// 每页显示数量（私有字段）
        /// </summary>
        private int _pageSize = 500;

        /// <summary>
        /// 每页显示数量（公开属性）
        /// 修改时会重置到第一页并重新计算总页数
        /// </summary>
        public int PageSize
        {
            get => _pageSize;
            set
            {
                _pageSize = value;
                OnPropertyChanged(nameof(PageSize)); // 通知UI更新
                OnPropertyChanged(nameof(TotalPages)); // 更新总页数显示
                CurrentPage = 1; // 重置到第一页
            }
        }

        /// <summary>
        /// 总页数（计算属性）
        /// 根据总数据量和每页大小动态计算
        /// </summary>
        public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);

        /// <summary>
        /// 存储所有导入的原始数据
        /// </summary>
        public ObservableCollection<string> _allData = new ObservableCollection<string>();

        /// <summary>
        /// 当前页显示的数据集合
        /// 绑定到ListView的ItemsSource
        /// </summary>
        public ObservableCollection<string> CurrentPageData { get; } = new ObservableCollection<string>();
        #endregion


        // 正确做法：暴露ICommand属性而非方法
        public ICommand ImportCommand1 { get; }
        public ICommand PrevPage { get; }
        public ICommand NextPage { get; }
        public ICommand Clear { get; }


        private string _title;

        public string Title
        {
            get => _title;
            set
            {
                _title = value;
                OnPropertyChanged(nameof(_title)); // 通知UI更新

            }
        }

        private string _differenceData;
        /// <summary>
        /// 差异数据
        /// </summary>
        public string DifferenceData
        {
            get => _differenceData;
            set
            {
                _differenceData = value;
                //OnPropertyChanged(nameof(_differenceData)); // 通知UI更新
                OnPropertyChanged(nameof(DifferenceData));
            }
        }


        private int _differenceDataCount;

        /// <summary>
        /// 差异数量
        /// </summary>
        public int DifferenceDataCount
        {
            get => _differenceDataCount;
            set
            {
                _differenceDataCount = value;
                OnPropertyChanged(nameof(DifferenceDataCount)); // 

            }
        }
        
        private int _repeatCount;

        /// <summary>
        /// 重复数量
        /// </summary>
        public int RepeatCount
        {
            get => _repeatCount;
            set
            {
                _repeatCount = value;
                OnPropertyChanged(nameof(RepeatCount)); // 

            }
        }





        public CompareDataViewModel( )
        {

            ImportCommand1 = new RelayCommand(_ => { Import1(); });

            PrevPage = new RelayCommand(_ => { PrevPage_Click(); });

            NextPage = new RelayCommand(_ => { NextPage_Click(); });
            Clear = new RelayCommand(_ => { Clear_Click(); });

            //Title = title;
        }

        #region 分页控制方法
        /// <summary>
        /// 更新当前页显示的数据
        /// 从_allData中提取当前页的数据放入CurrentPageData
        /// </summary>
        private void UpdateCurrentPageData()
        {
            CurrentPageData.Clear(); // 清空当前显示数据

            // 使用LINQ跳过前面页的数据，取当前页的数据
            var pageData = _allData
                .Skip((CurrentPage - 1) * PageSize)
                .Take(PageSize);

            // 将当前页数据添加到显示集合
            foreach (var item in pageData)
            {
                CurrentPageData.Add(item);
            }

            if( CurrentPage !=1 && pageData.Count() == 0)
            {
                CurrentPage = 1;
            }

            TotalCount = _allData.Count();
        }

        /// <summary>
        /// 首页按钮点击事件
        /// </summary>
        private void FirstPage_Click() => CurrentPage = 1;

        /// <summary>
        /// 上一页按钮点击事件
        /// 当前页减1，最小为1
        /// </summary>
        private void PrevPage_Click() => CurrentPage = Math.Max(1, CurrentPage - 1);

        /// <summary>
        /// 下一页按钮点击事件
        /// 当前页加1，最大不超过总页数
        /// </summary>
        private void NextPage_Click() => CurrentPage = Math.Min(TotalPages, CurrentPage + 1);

        private void Clear_Click()
        {
            var result = MessageBox.Show($"确定要清空{Title}数据吗？", "确认清空", MessageBoxButton.YesNo, MessageBoxImage.Question);

            if (result == MessageBoxResult.Yes)
            {
                // 执行清空操作

                // 清空原始数据
                _allData.Clear();

                // 更新分页显示（CurrentPageData）
                UpdateCurrentPageData();

                DifferenceData = "";

                DifferenceDataCount = 0;

                RepeatCount = 0;
            }
            else
            {
                // 用户点击了“否”，不执行任何操作
            }
        }

        /// <summary>
        /// 末页按钮点击事件
        /// </summary>
        private void LastPage_Click() => CurrentPage = TotalPages;
        #endregion

        #region Excel导入方法
        /// <summary>
        /// 导入按钮点击事件
        /// 1. 打开文件对话框选择Excel文件
        /// 2. 在后台线程读取数据
        /// 3. 更新UI显示
        /// </summary>

        public void Import1()
        {
            try
            {
                // 创建文件打开对话框
                OpenFileDialog dialog = new OpenFileDialog
                {
                    Filter = "Excel 工作簿(*.xlsx)|*.xlsx", // 文件过滤器
                    Title = "请选择Excel文件" // 对话框标题
                };

                // 显示对话框并确认选择
                if (dialog.ShowDialog() == true)
                {
                    // 在后台线程执行耗时操作，避免UI冻结
                    Task.Run(() =>
                    {
                        // 调用NPOI方法读取Excel数据
                        var data = ImportFirstColumnWithNPOI(dialog.FileName);

                        // 回到UI线程更新数据
                        Application.Current.Dispatcher.Invoke(() =>
                        {
                            _allData.Clear(); // 清空原有数据
                            foreach (var item in data)
                            {
                                _allData.Add(item); // 添加新数据
                            }

                            // 更新总数据量（会自动触发UI更新）
                            TotalCount = _allData.Count;
                            // 重置到第一页
                            CurrentPage = 1;

                            if(_allData.Count > 0)
                            {
 

                                int totalDuplicates = ToolsBase.GetDuplicatesFullInfo(data,
                                    out var duplicateItems,
                                    out var duplicateCounts,
                                    out var duplicateIndices);

                                StringBuilder sb = new StringBuilder();
                                sb.Append($"总重复数量: {totalDuplicates} \r\n");
                                foreach (var key in duplicateItems.Keys)
                                {
                                    var tip = $"项: {key}, 次数: {duplicateItems[key]}, 重复: {duplicateCounts[key]}, 索引: {string.Join(",", duplicateIndices[key])} \r\n";
                                    sb.Append(tip);
                                }

                                Debug.WriteLine(sb.ToString());

                                RepeatCount = totalDuplicates;
                            }

                            // 显示导入完成提示
                            MessageBox.Show($"成功导入 {TotalCount} 条数据", "导入完成",
                                MessageBoxButton.OK, MessageBoxImage.Information);
                        });
                    });
                }
            }
            catch (Exception ex)
            {
                // 捕获并显示异常信息
                MessageBox.Show($"导入异常：{ex.Message}", "错误",
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        /// <summary>
        /// 使用NPOI读取Excel第一列数据
        /// 从第二行开始读取，自动去除前后空格
        /// </summary>
        /// <param name="filePath">Excel文件路径</param>
        /// <returns>读取到的数据列表</returns>
        private List<string> ImportFirstColumnWithNPOI(string filePath)
        {
            List<string> result = new List<string>();

            // 使用文件流读取Excel文件
            using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                // 创建Excel工作簿对象（仅支持xlsx格式）
                IWorkbook workbook = new XSSFWorkbook(fs);
                // 获取第一个工作表
                ISheet sheet = workbook.GetSheetAt(0);

                // 从第二行开始遍历（索引1）
                for (int rowIndex = 1; rowIndex <= sheet.LastRowNum; rowIndex++)
                {
                    // 获取当前行
                    IRow row = sheet.GetRow(rowIndex);

                    if (row == null) continue; // 跳过空行

                    // 获取第一列单元格（索引0）
                    ICell cell = row.GetCell(0);
                    if (cell != null)
                    {
                        // 获取单元格值并去除前后空格
                        string value = cell.ToString().Trim();
                        if (!string.IsNullOrEmpty(value))
                        {
                            result.Add(value); // 添加到结果列表
                        }
                    }
                }
            }

            return result;
        }
        #endregion

        #region INotifyPropertyChanged接口实现
        /// <summary>
        /// 属性变更事件
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// 触发属性变更通知
        /// </summary>
        /// <param name="propertyName">属性名称</param>
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion

    }

}
